
package com.joysuch.wwyt.dataperm.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.joysuch.wwyt.dataperm.enums.DataPermissionFilterType;

@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface DataPermissionField {

    /**
     * 权限类型，有三种:<br>
     * 1. DEFAULT: 根据本字段的值，过滤数据权限<br>
     * 2. JOIN_TABLE: 通过join表的值字段，过滤数据权限，只支持一张表的join<br>
     * 3. SQL: 自定义SQL，本字段的值应在目标sql查询结果的范围内<br>
     * 
     * @return
     */
    DataPermissionFilterType type() default DataPermissionFilterType.DEFAULT;

    /**
     * 数据权限对应的数据库字段名称
     * 
     * @return
     */
    String sqlColumn() default "";

    /**
     * 规则启用的条件表达式(spring el)。 应用于某些特殊的需要根据条件启用过滤的场景:<br>
     * 1. 生产设施绑定监测点, 有害气体监测监测点没有绑定生产设施
     * 2. 如果绑定了生产设施，那么不启用本条件，否则启用
     * <br>
     * 该字段当前未启用，暂时不支持
     * 
     * @return 表达式
     */
    String enableExpression() default "true";

    /**
     * type = JOIN_TABLE时生效,
     * join其他表的信息，长度必须为3，格式为{&lt;joinTable&gt;,&lt;joinTableField&gt;,&lt;joinTableValueColumn&gt;},否则报错。<br>
     * 示例，查询风险点时，风险点关联的风险区域必须属于用户拥有数据权限的部门，数据关联关系为:<br>
     * 1. risk_point.RISK_DISTRICT_ID 是数据权限过滤字段( 本注解应加在这个字段上)<br>
     * 2. joinInfo = {"wwyt_risk_district","id","responsible_dept"}<br>
     * 
     * 完整的注解示例为
     * 
     * @DataPermissionField(type=DataPermissionFilterType.JOIN_TABLE, sqlColumn="RISK_DISTRICT_ID", joinInfo =
     *                                                                {"wwyt_risk_district","id","responsible_dept"})
     * 
     */
    String[] joinInfo() default {};

    /**
     * type = SQL时生效，自定义SQL，有如下约束:<br>
     * 1. 必须是select，且select只包含一个字段，字段数据类型和本字段一致<br>
     * 2. 提供 ${departs}作为占位符，查询时动态替换成用户拥有的权限部门<br>
     * 
     * @return
     */
    String filterSql() default "";
}
